<?php


namespace app\http;

use app\api\model\order\Order;
use app\common\model\product\ProductClaim;
use think\worker\Server;
use Workerman\Lib\Timer;


class Worker extends Server
{

    protected $socket = 'websocket://0.0.0.0:2349';

    protected $uidConnections = [];//uid存储
    protected $clientIdConnections = [];//uid存储
    protected $client_id;
    static $id  = 0;
    static $count  = 0;

    /**
     * 检测心跳
     */
//    protected static $heartbeat_time = 1500;

    /**
     * 收到信息
     * @param $connection
     */
    public function onMessage($connection)
    {

        // 生成一个唯一用户的客户端id
        $this->client_id = time().rand(100,999);
        // 将生成的client_id赋给当前连接
        $connection->client_id = $this->client_id;

        // 在当前worker对象中新添属性  保存当前登录的用户的client_id 和 连接对象
        // 以便进行推送
        $this->worker->clientIdConnections[$connection->client_id] = $connection;

        // 将生成的client_id发送给客户端
        $json = [
            'type'  =>  'bind',
            'from'  =>  'worker',
            'to'    =>  $connection->client_id,
            'content' => $this->client_id
        ];
        $connection->send(json_encode($json,true));
        exit;
        //        $obj = json_decode($data);
        file_put_contents('hxpay.txt',date('Y-m-d H:i:s') . "\r\n", FILE_APPEND);
        file_put_contents('hxpay.txt',var_export($data,true) . "\r\n", FILE_APPEND);
        $connection->send("收到啦！！！！！");


    }

    /**
     * 当连接建立时触发的回调函数,应用n秒一次广播
     * @param $connection
     */
    public function onConnect($connection)
    {
        // 生成一个唯一用户的客户端id
        $this->client_id = time().rand(100,999);
        // 将生成的client_id赋给当前连接
        $connection->client_id = $this->client_id;

        // 在当前worker对象中新添属性  保存当前登录的用户的client_id 和 连接对象
        // 以便进行推送
        $this->worker->clientIdConnections[$connection->client_id] = $connection;

        // 将生成的client_id发送给客户端
        $json = [
            'type'  =>  'bind',
            'from'  =>  'worker',
            'to'    =>  $connection->client_id,
            'content' => $this->client_id
        ];
        $connection->send(json_encode($json,true));
    }

    /**
     * 当连接断开时触发的回调函数
     * @param $connection
     */
    public function onClose($connection)
    {
//        self::$count--;
//        if(isset($connection->uid))
//        {
//            // 连接断开时删除映射
//            $data = '***会员'.'||'.'0'.'||'.'id:||'.self::$count.'||'.'203';
//            $this->broadcast($data);
//
//            //销毁用户池对应对象
//            unset($this->clientIdConnections[$connection->uid]);
//            #关闭连接
//            $connection->close();
//        }
    }

    /**
     * 当客户端的连接上发生错误时触发
     * @param $connection
     * @param $code
     * @param $msg
     */
    public function onError($connection, $code, $msg)
    {
        echo "error $code $msg\n";
    }

    /**
     * 每个进程启动
     * @param $worker
     */
    public function onWorkerStart($worker)
    {
//        Timer::add(1, function () {
//            // 订单超时
//            (new Order()) -> getRedisOrder();
//
//        });
    }

// 向所有验证的用户推送数据
    function broadcast($message)
    {
        foreach($this->clientIdConnections as $connection)
        {
            $connection->send($message);
        }
    }



    // 针对uid推送数据
//    function sendMessageByUid($uid, $message)
//    {
//
//        if(isset($this->uidConnections[$uid]))
//        {
//
//            $connection = $this->uidConnections[$uid];
//
//            $connection->send($message);
//            return true;
//        }
//        return false;
//    }

}
